package com.liyao.storehouse.api.utill;

import org.apache.commons.codec.binary.Hex;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * HmacSHA256加密工具
 * @author weining
 * @since 2024.9.28
 */
public class HmacSha256 {

    /**
     * 进行HmacSHA256加密以16进制输出再进行Base64加密
     * @param data 要加密的字符串
     * @param secret 秘钥
     * @return 加密后字符串
     */
    public static String hmacSha256ToBase64(String data, String secret) {
        try {
            // 创建一个HMAC-SHA256密钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(secret.getBytes(), "HmacSHA256");

            // 获取Mac实例来执行HMAC-SHA256操作
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(secretKeySpec);

            // 执行HMAC-SHA256操作
            byte[] hmacSha256Result = mac.doFinal(data.getBytes());

            // 转换为16进制字符串
            String hexOutput = Hex.encodeHexString(hmacSha256Result);

            // 将结果编码为Base64
            return Base64.getEncoder().encodeToString(hexOutput.getBytes());
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException("Failed to calculate HMAC-SHA256", e);
        }
    }

    /**
     * SHA256，安全散列算法（Secure Hash Algorithm 256-bit），一种被广泛使用的密码散列函数，可以产生出一个固定长度的散列值。用于确保信息传输完整一致。
     * @param plainString 明文
     * @return cipherString 密文
     */
    public static String sha256(String plainString) {
        String cipherString = "";
        try {
            // 获取实例（SHA-512同理）
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            // 计算摘要
            byte[] cipherBytes = messageDigest.digest(plainString.getBytes(StandardCharsets.UTF_8));
            // 输出为16进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : cipherBytes) {
                sb.append(String.format("%02x", b));
            }
            cipherString = sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherString;
    }

    public static void main(String[] args) {
//        String data = "客户终端请求轨迹ID，用于追踪客户终端的请求轨迹，可以是客户终端设备ID等信息，同一终端此值需保存不变";
//        String encoded = sha256(data);
//        System.out.println("Encoded with SHA256: " + encoded);
        System.out.println(hmacSha256ToBase64("20241217332996032941774308530f2adcfef73369bfc4e1384677d38a0ff","f2adcfef73369bfc4e1384677d38a0ff"));
    }
}
